package futbol.tacticas.concursantes.TacticaJuvent_FC;

import java.awt.Color;
import java.awt.Point;
import java.util.Random;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

public class TacticaJuvent_FC implements Tactica {
	
	/*
	 * Matriz de enteros con las posiciones iniciales en el campo
	 * de los 11 jugadores y con la furza asociada a cada jugador.
	 */
	private int nValores[][] = {
			/*
			 * Estructura {1�,2�,3�} : 
			 * 		1.- posici�n : valor x
			 * 		2.- posici�n : valor y
			 * 		3.- fuerza del jugador entre 0-10 			
			 */
			
			{-150,0,2},   // Jugador 1 
			{-120,-40,4}, // Jugador 2 
			{-120,40,4},  // Jugador 3 
			{-120,-20,4}, // Jugador 4 
			{-120,20,4},  // Jugador 5 
			{-80,0,4},    // Jugador 6 
			{-22,-52,4},    // Jugador 7 
			{-20,41,4},     // Jugador 8  
			{57,-3,7},   // Jugador 9 
			{91,-30,7},   // Jugador 10 
			{93,36,7}    // Jugador 11			
	};
	
	private int nCuadrantes[][] = {	
			{0,0},
			{-40,0},      // Cuadrante Lateral izquierdo {ejeX,ejeY}
			{-40,0},	  // Cudarante Lateral derecho {ejeX,ejeY}
			{-40,-30,30}, // Cuadrante Centrales {ejeX,ejeY,ejeY}
			{-40,-30,30}, // Cuadrante Centrales {ejeX,ejeY,ejeY}
			{-60,-30,30}, // Cuadtrante Centrocampista Defensivo {ejeX,ejeX}
			{-40,0}, // Cuadrante Centrocampista organizador {ejeX,ejeX,ejeY}
			{-40,0},      //Cuadrante Centrocampista Iz {ejeX,ejeX,ejeY}
			{0,0},     //Cuadrante Centrocampista De {ejeX,ejeY}
			{40,0},      //Cuadrante Delantero DE {ejeX,ejeY}
			{40,0}   //Cuadrante Delantero IZ {ejeX,ejeY}
	};
	
	private int nCubiertos[][] = {
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0},
			{- 1 , 0}
	};
			
	private int matrizMovimientos[][] = {
			{38  , 0},    // ir a la derecha
			{0   ,  38},  // ir abajo			
			{0   , -38},  // ir arriba
			{38 , -38},
			{38 , 38}
	};
	
	/**
	 * 
	 */
	public Color getColor1() {		
		return Color.BLUE;
	}

	/**
	 * 
	 */
	public Color getColor2() {
		return Color.WHITE;
	}

	/**
	 * 
	 */
	public Color getColorNumero() { 
		return Color.BLACK;
	}	
	
	/**
	 * 
	 */
	public String getNombre() {
		return "Juvent F.C.";
	}

	/**
	 * Metodo que devuelve un entero con la posicion X en el campo del jugador.
	 */
	public int getXInicial(int n) {			
		return nValores[n][0];
	}

	/**
	 * Metodo que devuelve un entero con la posicion Y en el campo del jugador.
	 */
	public int getYInicial(int n) {
		return nValores[n][1];
	}
	
	/**
	 * Metodo que devuelve un entero entre 0 y 10 con la fuerza del jugador.
	 */
	public int getFuerza(int n) {
		return nValores[n][2];
	}

	private SituacionJugadores sjActual = null;
	private SituacionJugadores sjAnterior = null;
	private Point bolaActual = null;
	private Point bolaAnterior = null;
	private Vector <Comando> comandos = null;
	private int pendiente = 0;
	private int ordenadaOrigen = 0;
	private int tiempo = 0;
	private int golesAfavor = 0;
	private int golesEnContra = 0;
	private Point[] jugEquipo = null;
	private Point[] jugRivales = null;
	
	public Vector<Comando> getComandos(SituacionJugadores sj) {
		 /*
		  * Inicializar parametros
		  */
		 sjActual = sj;
		 bolaActual = sj.getBola();
		 jugEquipo = sj.getMisJugadores();
		 jugRivales = sj.getContrario();
		 comandos = new Vector();		 
		 /*
		  * Compruebo si acaba de empezar el partido o se ha metido un gol ya que en tal caso
		  * se inicializan de nuevo los parametros
		  */
		 if (sjAnterior != null) {
			 bolaAnterior = sjAnterior.getBola();
		          	         
	         if (bolaActual.x == 0 && bolaActual.y == 0 && bolaAnterior.x >= 159)
	           	golesAfavor ++;
	           		           	         	            
	         if (bolaActual.x == 0 && bolaActual.y == 0 && bolaAnterior.x <= -159)
	           	golesEnContra ++;	           	      	         
	         
	         /*
			  * Ecuacion de la recta : y = mx + b
			  * Pendiente de la recta que pasa por dos puntos : m = y1 - y2 / x1 - x2
			  * La ordenada en el origen de una recta que pasa por dos puntos es : b = y1 - m*x1 � b = y2 - m*x2
			  */         
	          
	         if (bolaActual.x != 0 && bolaActual.y != 0) {
	        	 int resta1 = bolaActual.y - bolaAnterior.y;
	        	 int resta2 = bolaActual.x - bolaAnterior.x;
	        	 
	        	 int m = 0;
	        	 if (resta1 != 0 && resta2 != 0)
	        		 m = resta1  / resta2;	        	 

			   	 int b = bolaActual.y - m * bolaActual.x;
	        		        	 
	        	 // guardar pendiente y ordenada en el origen
	        	 pendiente = m;
	             ordenadaOrigen = b;
	         }
		 }else {
			 /*
			  * Para hacer que todos los jugadores se pongan en un sitio en concreto al principio del partido
			  */			 
			 for (int i = 0 ; i < 11 ; i++ ) {
				/*
				 * ComandoIrA hace que dado un jugador se dirija
				 * a la posicion pasada por parametro.Parametros :
				 * 		1.- Entero con el n�mero del jugador
				 * 		2.- Double con la posici�n X del campo.
				 * 		3.- Double con la posici�n Y del campo.
				 */
				comandos.add(new ComandoIrA(i,nValores[i][0],nValores[i][1]));
			 }		
		 }
		 
		 /*
		  * Calculo los turnos el tiempo que llevo de partido
		  */
		 tiempo ++;
		 if (tiempo == 1800) {
		   //System.out.println("FIN DEL PARTIDO");
		 }
		 /*
		  * Guardo la posicion actual en anterior para el proximo turno
		  */
		 sjAnterior = sjActual;
		
		 /* PORTERO */
		 moverPortero();
		 
		 /* LATERALES */
		 if (!pasarDelantero(1))
			 moverDefensaIZ(1 , bolaActual.x , bolaActual.y);
		 if (!pasarDelantero(2))
			 moverDefensaDE(2 , bolaActual.x , bolaActual.y);
		 
		 /* CENTRALES */
		 if (!pasarDelantero(3))
		 	moverDefensaCentral(3 , bolaActual.x , bolaActual.y);
		 if (!pasarDelantero(4))
			moverDefensaCentral(4 , bolaActual.x , bolaActual.y);
		 
		 /* CENTROCAMPISTAS DEFENSIVOS*/
		 if (!pasarDelantero(5))
		    moverDefensaCentral(5 , bolaActual.x , bolaActual.y);
		 
		 /* CENTROCAMPISTAS */
		 if (!pasarDelantero(6))
		 moverCentrocampistaDE(6,bolaActual.x, bolaActual.y);
		 if (!pasarDelantero(7))
		 moverCentrocampistaIZ(7, bolaActual.x, bolaActual.y);
		 
		 moverMediapuntaDefensivo(8 , bolaActual.x , bolaActual.y );
		 moverDelanteroDefensivoIZ(9, bolaActual.x , bolaActual.y );
		 moverDelanteroDefensivoDE(10 , bolaActual.x , bolaActual.y );
	
		 int numCentrocampistaSolo = comprobarSoloCentrocampistas();
		 int numDelanteroSolo = comprobarSoloDelanteros();		 				 		 	
         
		 regatear(1,jugEquipo[numCentrocampistaSolo].x,jugEquipo[numCentrocampistaSolo].y);
		 regatear(2,jugEquipo[numCentrocampistaSolo].x,jugEquipo[numCentrocampistaSolo].y);
		 regatear(3,jugEquipo[numCentrocampistaSolo].x,jugEquipo[numCentrocampistaSolo].y);
		 regatear(4,jugEquipo[numCentrocampistaSolo].x,jugEquipo[numCentrocampistaSolo].y);
		 regatear(5,jugEquipo[numCentrocampistaSolo].x,jugEquipo[numCentrocampistaSolo].y);				 
		 regatear(6,jugEquipo[numDelanteroSolo].x,jugEquipo[numDelanteroSolo].y);
		 regatear(7,jugEquipo[numDelanteroSolo].x,jugEquipo[numDelanteroSolo].y);		 		 		 	
		 
		 tirarApuerta(8);
		 tirarApuerta(9);
		 tirarApuerta(10);
		 
		 return comandos;
	}
	
	public boolean pasarDelantero(int nJug) {
		int num = 0;
		boolean parar = false;
		for (int i = 8 ; i < 11 && !parar; i ++ ) {
			double disDelantero = General.getDistancia(jugEquipo[i].x, jugEquipo[i].y, bolaActual.x, bolaActual.y);
			if (disDelantero < 30) {
				num = i;
				parar = true;
			}
		}
		if (num != 0) {
			comandos.add(new ComandoPase(nJug,num));
			return true;
		}else
			return false;
	}
	public void moverPortero(){
		 int posYPortero = 0;
   	 posYPortero = pendiente * nValores[0][0] + ordenadaOrigen;	        	
   	 
   	 if (posYPortero  < -30)
   		 posYPortero = -30;
   	 if (posYPortero > 30)
   		 posYPortero = 30;    	     	 
   	 
   	 /*if (nValores[0][1] != 0 && pendiente != 0)
   	 posXPortero = (nValores[0][1] / pendiente) + ordenadaOrigen;
   	 
   	 if (posXPortero > -147)
   		 posXPortero = -147;*/
   	     	 				        	
   	 comandos.add(new ComandoIrA(0,jugEquipo[0].x,posYPortero));
   	 
   	 if (jugEquipo[0].y > 0) // parte baja de porteria
			 comandos.add(new ComandoGolpearBola(0,0,300));
		 else // parte alta de porteria
			 comandos.add(new ComandoGolpearBola(0,0,-300));
	
	}
	public void moverDefensaCentral(int nJug , double posX , double posY) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);			
		/*if (posX < nCuadrantes[nJug][0] && posY > nCuadrantes[nJug][1] && posY < nCuadrantes[nJug][2]) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;						
			}
		}else*/ if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		}else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			if (jugRivales[numContrarioCercano].x < -50) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca					
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						marcajeSegunPosBalon(nJug);
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXdefensa = nValores[nJug][0];
				
					comandos.add(new ComandoIrA(nJug,nValores[nJug][0],nValores[nJug][1]));
					
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXdefensa = nValores[nJug][0];
			
				comandos.add(new ComandoIrA(nJug,nValores[nJug][0],nValores[nJug][1]));
						
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}									
		}
		
	}
	public void moverDefensaIZ(int nJug , double posX , double posY ) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);
		/*if (posX < nCuadrantes[nJug][0] && posY < nCuadrantes[nJug][1]) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;					
			}
		} else*/ if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		} else { 							
			if (jugRivales[numContrarioCercano].x < -40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si yo mismo estoi cubriendo al contrario
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //Compruebo si esta cubierto por algun otro jugador si no lo esta voy a cubrirle
					marcajeSegunPosBalon(nJug);
					nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
					nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXdefensa = nValores[nJug][0];
				
					comandos.add(new ComandoIrA(nJug,posXdefensa,posYdefensa));
				
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXdefensa = nValores[nJug][0];
			
				comandos.add(new ComandoIrA(nJug,posXdefensa,posYdefensa));
				//Si se aleja de mi cuadrante y el jugador mas cercano estaba cubierto por mi suelto el marcaje
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}	
		}
	}
	public void moverDefensaDE(int nJug , double posX , double posY ) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);			
		/*if (posX < nCuadrantes[nJug][0] && posY > nCuadrantes[nJug][1]) { // La pelota esta en mi cuadrante y voy a buscarla				
			comandos.add(new ComandoIrA(nJug,posX,posY)); 				
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;					
			}
		} else */if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		} else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			if (jugRivales[numContrarioCercano].x < -40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						marcajeSegunPosBalon(nJug);
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXdefensa = nValores[nJug][0];
					comandos.add(new ComandoIrA(nJug,posXdefensa,posYdefensa));					
					
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYdefensa = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXdefensa = nValores[nJug][0];
			
				comandos.add(new ComandoIrA(nJug,posXdefensa,posYdefensa));
				//Si se aleja de mi cuadrante y el jugador mas cercano estaba cubierto por mi suelto el marcaje
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}										
		}
	}
	

	
	public void moverCentrocampistaIZ (int nJug , double posX , double posY ) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);
		/*if (posX > nCuadrantes[nJug][0] && posY < nCuadrantes[nJug][1] ) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;						
			}
		}else */if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		}else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			
			if (jugRivales[numContrarioCercano].x > -40 && jugRivales[numContrarioCercano].x < 40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					comandos.add(new ComandoIrA(nJug,jugRivales[numContrarioCercano].x + 12,jugRivales[numContrarioCercano].y));
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						comandos.add(new ComandoIrA(nJug,jugRivales[numContrarioCercano].x + 12,jugRivales[numContrarioCercano].y));
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYorganizador = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXorganizador = nValores[nJug][0];				
					comandos.add(new ComandoIrA(nJug,posXorganizador,posYorganizador));				
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion					
				int posYorganizador = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXorganizador = nValores[nJug][0];
			
				comandos.add(new ComandoIrA(nJug,posXorganizador,posYorganizador));
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}															
		}
	}
	public void moverCentrocampistaDE(int nJug , double posX , double posY ) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);
		/*if (posX > nCuadrantes[nJug][0] && posY > nCuadrantes[nJug][1] ) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;						
			}
		}else */if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		}else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			
			if (jugRivales[numContrarioCercano].x > -40 && jugRivales[numContrarioCercano].x < 40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					comandos.add(new ComandoIrA(nJug,jugRivales[numContrarioCercano].x + 12,jugRivales[numContrarioCercano].y));
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						comandos.add(new ComandoIrA(nJug,jugRivales[numContrarioCercano].x + 12,jugRivales[numContrarioCercano].y));
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYorganizador = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXorganizador = nValores[nJug][0];
					comandos.add(new ComandoIrA(nJug,posXorganizador,posYorganizador));				
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion					
				int posYorganizador = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXorganizador = nValores[nJug][0];
				comandos.add(new ComandoIrA(nJug,posXorganizador,posYorganizador));
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}															
		}
	}
	public void moverMediapuntaDefensivo(int nJug, double posX, double posY) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);			
		/*if (posX > nCuadrantes[nJug][0]) { // La pelota esta en mi cuadrante y voy a buscarla				
			comandos.add(new ComandoIrA(nJug,posX,posY)); 				
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;					
			}
		} else */if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		} else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			if (jugRivales[numContrarioCercano].x > 0) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						marcajeSegunPosBalon(nJug);
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYmediapunta = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXmediapunta = nValores[nJug][0];
					comandos.add(new ComandoIrA(nJug,posXmediapunta,posYmediapunta));								
				
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYmediapunta = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXmediapunta = nValores[nJug][0];
				comandos.add(new ComandoIrA(nJug,posXmediapunta,posYmediapunta));								
				//Si se aleja de mi cuadrante y el jugador mas cercano estaba cubierto por mi suelto el marcaje
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}										
		}
		
	}
	public void moverDelanteroDefensivoIZ(int nJug , double posX , double posY) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);			
		/*if (posX > nCuadrantes[nJug][0] && posY < nCuadrantes[nJug][1]) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;						
			}
		}else */
		if (posX > nCuadrantes[nJug][0] && posY < nCuadrantes[nJug][1]) {
			//voy a buscar el pase de la muerte
			if (General.getDistancia(jugEquipo[nJug].x,jugEquipo[nJug].y, posX, posY) > 20)
				comandos.add(new ComandoIrA(nJug,124,-30));
			else // busco la pelota para golpearla
				comandos.add(new ComandoIrA(nJug,posX,posY));
		} else if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		}else { //Como la pelota no esta en mi cuadrante vuelvo a la posicion inicial
			if (jugRivales[numContrarioCercano].x > 40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si ese contrario no esta cubierto ya por otro jugador
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca					
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //No esta cubierto voy a cubrirle
						marcajeSegunPosBalon(nJug);
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYdelantero = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXdelantero = nValores[nJug][0];
					comandos.add(new ComandoIrA(nJug,posXdelantero,posYdelantero));								
					
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYdelantero = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXdelantero = nValores[nJug][0];
				comandos.add(new ComandoIrA(nJug,nValores[nJug][0],nValores[nJug][1]));								
						
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}									
		}
		
	}
	public void moverDelanteroDefensivoDE(int nJug , double posX , double posY ) {
		int numContrarioCercano = sjActual.getContrarioMasCerca(jugEquipo[nJug].x,jugEquipo[nJug].y);
		/*if (posX > nCuadrantes[nJug][0] && posY > nCuadrantes[nJug][1]) { // La pelota esta en mi cuadrante y voy a buscarla
			comandos.add(new ComandoIrA(nJug,posX,posY));
			if (nCubiertos[numContrarioCercano][0] == nJug) {
				nCubiertos[numContrarioCercano][0] = - 1;
				nCubiertos[numContrarioCercano][1] = 0;					
			}
		} else*/ 
		if (posX > nCuadrantes[nJug][0] && posY > nCuadrantes[nJug][1]) {
			//voy a buscar el pase de la muerte
			if (General.getDistancia(jugEquipo[nJug].x,jugEquipo[nJug].y, posX, posY) > 20)
				comandos.add(new ComandoIrA(nJug,124,30));
			else
				comandos.add(new ComandoIrA(nJug,posX,posY));
		} else if (nJug == sjActual.getMasCercanoDeBola()) { // La pelota no esta en mi cuadrante pero soy el jugador mas cercano a la pelota
			comandos.add(new ComandoIrA(nJug,posX,posY));
			for (int i = 0 ; i < 11 ; i ++ ) {
				if (nCubiertos[i][0] == nJug) {
					nCubiertos[i][0] = - 1;
					nCubiertos[i][1] = 0;
				}
			}
		} else { 							
			if (jugRivales[numContrarioCercano].x > 40) { 
				//La pelota no esta en mi cuadrante pero existe un rival en el
				//Compruebo si yo mismo estoi cubriendo al contrario
				if (nCubiertos[numContrarioCercano][0] == nJug) {//Le cubro y mantengo el marcaje como no esta la pelota cerca
					marcajeSegunPosBalon(nJug);
				} else if (nCubiertos[numContrarioCercano][1] == 0) { //Compruebo si esta cubierto por algun otro jugador si no lo esta voy a cubrirle
					marcajeSegunPosBalon(nJug);
						nCubiertos[numContrarioCercano][0] = nJug; //Numero del jugador que cubre
						nCubiertos[numContrarioCercano][1] = 1; //significa que ese jugador esta cubierto
				}else {//Esta cubierto mantengo mi posicion 
					int posYdelantero = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
					int posXdelantero = nValores[nJug][0];
					comandos.add(new ComandoIrA(nJug,posXdelantero,posYdelantero));													
				}
			} else { //Esta fuera de mi cuadrante mantengo mi posicion
				int posYdelantero = pendiente * jugEquipo[nJug].x  + ordenadaOrigen;
				int posXdelantero = nValores[nJug][0];
				comandos.add(new ComandoIrA(nJug,nValores[nJug][0],nValores[nJug][1]));								
						
				//Si se aleja de mi cuadrante y el jugador mas cercano estaba cubierto por mi suelto el marcaje
				for (int i = 0 ; i < 11 ; i ++ ) {
					if (nCubiertos[i][0] == nJug) {
						nCubiertos[i][0] = - 1;
						nCubiertos[i][1] = 0;
					}
				}
			}	
		}
	}

public void regatear (int nJug , int posXcompiSolo , int posYcompiSolo ) {
	double distanciaBalon = General.getDistancia(bolaActual.x, bolaActual.y,jugEquipo[nJug].x, jugEquipo[nJug].y);
	if (distanciaBalon < 10) {
		if (jugEquipo[nJug].x > 100 && jugEquipo[nJug].y < 80 && jugEquipo[nJug].y > -80) {
			if (jugEquipo[nJug]. y > 0)
				comandos.add(new ComandoPase(nJug,10));
			else
				comandos.add(new ComandoPase(nJug,9));
		}else {
		/*
		 * 	Escojo la direccion mas adecuada para conducir la pelota siempre que este en mi cuadrante
		 * si no lo estoi paso la pelota
		 */		
		int posXfutura = 0;
		int posYfutura = 0;
		boolean avanzar = false;		
		for (int i = 0; i < matrizMovimientos.length && !avanzar; i ++ ) {
			posXfutura = bolaActual.x + matrizMovimientos[i][0];
			posYfutura = bolaActual.y + matrizMovimientos[i][1];
			posXfutura = (int) corregirLateral(160 , posXfutura);
			posYfutura = (int) corregirLateral(120 , posYfutura);
			/*
			 * 	Me recupero el numero del contrario mas cercano a la posicion a la que quiero intentar ir
			 */
			int nJugRival = sjActual.getContrarioMasCerca(posXfutura,posYfutura);
			/*
			 * 	Calculo la distancia del contrario a la posicion a la que deseo ir
			 */
			double distanciaRivalPosFutura = General.getDistancia(posXfutura,posYfutura,jugRivales[nJugRival].x,jugRivales[nJugRival].y);
		
			if (distanciaRivalPosFutura > 30) {					                 
				comandos.add(new ComandoGolpearBola(nJug, posXfutura, posYfutura));
	               avanzar = true;
			}
		}
		
		if (!avanzar) {//no se ha encontrado ningun movimiento seguro
			comandos.add(new ComandoGolpearBola(nJug,posXcompiSolo,posYcompiSolo));
		}
		}
	}
}

	 public double corregirLateral(double limite, double x){
	        if (x>limite) return limite*2-x;
	        if (x<-limite) return -limite*2-x;
	        return x;
	    }
	 public void marcajeSegunPosBalon ( int nJug ) {
			int nJugRival = sjActual.getContrarioMasCerca(nJug);
			int posXrival = jugRivales[nJugRival].x;
			int posYrival = jugRivales[nJugRival].y;
			int posXbola = bolaActual.x;
			int posYbola = bolaActual.y;
			int movimientos[][] = {
					{posXrival + 15,posYrival},
					{posXrival + 10,posYrival - 10},
					{posXrival,posYrival - 15},
					{posXrival - 10,posYrival - 10},
					{posXrival - 15,posYrival},
					{posXrival - 10,posYrival + 10},
					{posXrival,posYrival + 15},
					{posXrival + 10,posYrival + 10}
			};
			
			if (posXbola > posXrival && posYbola == posYrival) {
				//movimiento 1
				comandos.add(new ComandoIrA(nJug,movimientos[0][0],movimientos[0][1]));
			} else  if (posXbola > posXrival && posYbola < posYrival) {
				//movimiento 2
				comandos.add(new ComandoIrA(nJug,movimientos[1][0],movimientos[1][1]));
			} else if (posXbola == posXrival && posYbola < posYrival) {
				//movimiento 3
				comandos.add(new ComandoIrA(nJug,movimientos[2][0],movimientos[2][1]));
			} else if (posXbola < posXrival && posYbola < posYrival) {
				//movimiento 4
				comandos.add(new ComandoIrA(nJug,movimientos[3][0],movimientos[3][1]));
			} else if (posXbola < posXrival && posYbola == posYrival) {
				//movimiento 5						
				comandos.add(new ComandoIrA(nJug,movimientos[4][0],movimientos[4][1]));
			} else if (posXbola < posXrival && posYbola > posYrival) {
				//movimiento 6
				comandos.add(new ComandoIrA(nJug,movimientos[5][0],movimientos[5][1]));
			} else if (posXbola == posXrival && posYbola > posYrival) {
				//movimiento 7
				comandos.add(new ComandoIrA(nJug,movimientos[6][0],movimientos[6][1]));
			} else if (posXbola > posXrival && posYbola > posYrival) {
				//movimiento 8
				comandos.add(new ComandoIrA(nJug,movimientos[7][0],movimientos[7][1]));
			}   	      	   	    		
	 }
	 public void tirarApuerta (int nJug ) {
			
		 if (jugEquipo[nJug].y == 0) {//estoy centrado de cara a porteria
				 Random Ram = new Random();
				 int tiro = Ram.nextInt(3);				
				 comandos.add(new ComandoTiroAPuerta(nJug,tiro));
			 } else if (jugEquipo[nJug].y < 0) { //estoy en la parte de arriba
				 if (jugEquipo[nJug].y < -60 && jugEquipo[nJug].x > 120) { //estoy en la zona del corner
					 //Realizo el pase de la muerte
					 comandos.add(new ComandoPase(nJug,10));
				 } else { 
					 Random Ram = new Random();
					 int tiro = Ram.nextInt(7) * -1;					 
					 comandos.add(new ComandoTiroAPuerta(nJug,tiro));
				 }
			 } else { //estoy en la parte de abajo
				 if (jugEquipo[nJug].y > 60 && jugEquipo[nJug].x > 120) { //estoy en la zona del corner
					 //Realizo el pase de la muerte
					 comandos.add(new ComandoPase(nJug,10));
				 } else { 				
					 Random Ram = new Random();
					 int tiro = Ram.nextInt(7);					 
					 comandos.add(new ComandoTiroAPuerta(nJug,tiro));
				 }
			 }
	}
					
	public int comprobarSoloCentrocampistas() {
		int distancia = - 9999;
		int numJ = 0;		
		for (int i = 6; i < 9 ; i ++ ) {
			// Recupero el contrario mas cercano a uno de mis jugadores
			int contrario = sjActual.getContrarioMasCerca(i);
			// Calculo la distancia de ese contrario al jugador
			Double d = General.getDistancia(jugEquipo[i].x,jugEquipo[i].y,jugRivales[contrario].x,jugRivales[contrario].y);
			int dis = d.intValue();
			if (dis > distancia) {
				
				distancia = dis;
				numJ = i;
			}					
		}
		
		return numJ;
	}
	
	public int comprobarSoloDelanteros() {
		int distancia = - 9999;
		int numJ = 0;		
		for (int i = 8; i < 11 ; i ++ ) {
			// Recupero el contrario mas cercano a uno de mis jugadores
			int contrario = sjActual.getContrarioMasCerca(i);
			// Calculo la distancia de ese contrario al jugador
			Double d = General.getDistancia(jugEquipo[i].x,jugEquipo[i].y,jugRivales[contrario].x,jugRivales[contrario].y);
			int dis = d.intValue();
			if (dis > distancia) {
				
				distancia = dis;
				numJ = i;
			}					
		}		
		return numJ;
	}

	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
}
